package com.example.baselibrary.utils

import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes
import androidx.core.content.res.ResourcesCompat
import com.google.zxing.BarcodeFormat
import com.google.zxing.WriterException
import com.google.zxing.common.BitMatrix
import com.google.zxing.qrcode.QRCodeWriter

object QRCodeUtils {

    /**
     * 将字符串生成二维码图片
     * @param content 要转换的字符串
     * @param width 二维码宽度（像素）
     * @param height 二维码高度（像素）
     * @return 生成的二维码Bitmap，失败返回null
     */
    fun generateQRCode(content: String, width: Int, height: Int): Bitmap? {
        return try {
            // 检查输入参数
            if (content.isEmpty() || width <= 0 || height <= 0) {
                return null
            }

            // 创建QRCode写入器
            val qrCodeWriter = QRCodeWriter()
            // 生成BitMatrix（二维码矩阵）
            val bitMatrix: BitMatrix = qrCodeWriter.encode(
                content,
                BarcodeFormat.QR_CODE,
                width,
                height,
                mapOf(
                    com.google.zxing.EncodeHintType.CHARACTER_SET to "UTF-8", // 字符集
                    com.google.zxing.EncodeHintType.ERROR_CORRECTION to com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H // 纠错级别（最高）
                )
            )

            // 将BitMatrix转换为Bitmap
            val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565)
            for (x in 0 until width) {
                for (y in 0 until height) {
                    // 黑色二维码，白色背景
                    bitmap.setPixel(x, y, if (bitMatrix.get(x, y)) Color.BLACK else Color.WHITE)
                }
            }
            bitmap
        } catch (e: WriterException) {
            e.printStackTrace()
            null
        }
    }

    /**
     * 生成带颜色的二维码
     * @param content 要转换的字符串
     * @param width 二维码宽度（像素）
     * @param height 二维码高度（像素）
     * @param foregroundColor 前景色（二维码点的颜色）
     * @param backgroundColor 背景色
     * @return 生成的彩色二维码Bitmap，失败返回null
     */
    fun generateColoredQRCode(
        content: String,
        width: Int,
        height: Int,
        @ColorInt foregroundColor: Int = Color.BLACK,
        @ColorInt backgroundColor: Int = Color.WHITE
    ): Bitmap? {
        return try {
            if (content.isEmpty() || width <= 0 || height <= 0) {
                return null
            }

            val qrCodeWriter = QRCodeWriter()
            val bitMatrix: BitMatrix = qrCodeWriter.encode(
                content,
                BarcodeFormat.QR_CODE,
                width,
                height,
                mapOf(
                    com.google.zxing.EncodeHintType.CHARACTER_SET to "UTF-8",
                    com.google.zxing.EncodeHintType.ERROR_CORRECTION to com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H
                )
            )

            val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
            val canvas = Canvas(bitmap)
            val paint = Paint().apply { isAntiAlias = true }

            // 绘制背景色
            paint.color = backgroundColor
            canvas.drawRect(0f, 0f, width.toFloat(), height.toFloat(), paint)

            // 绘制前景色（二维码点）
            paint.color = foregroundColor
            for (x in 0 until width) {
                for (y in 0 until height) {
                    if (bitMatrix.get(x, y)) {
                        canvas.drawPoint(x.toFloat(), y.toFloat(), paint)
                    }
                }
            }

            bitmap
        } catch (e: WriterException) {
            e.printStackTrace()
            null
        }
    }

    /**
     * 生成带图标和颜色的二维码
     * @param content 要转换的字符串
     * @param width 二维码宽度（像素）
     * @param height 二维码高度（像素）
     * @param foregroundColor 前景色（二维码点的颜色）
     * @param backgroundColor 背景色
     * @param logoBitmap 中间图标Bitmap
     * @param logoSizeRatio 图标相对于二维码的大小比例（0-1之间）
     * @return 生成的带图标的彩色二维码Bitmap，失败返回null
     */
    fun generateQRCodeWithLogo(
        content: String,
        width: Int,
        height: Int,
        @ColorInt foregroundColor: Int = Color.BLACK,
        @ColorInt backgroundColor: Int = Color.WHITE,
        logoBitmap: Bitmap?,
        logoSizeRatio: Float = 0.2f
    ): Bitmap? {
        // 首先生成彩色二维码
        val qrBitmap = generateColoredQRCode(content, width, height, foregroundColor, backgroundColor)
            ?: return null

        // 如果没有提供图标，则返回普通彩色二维码
        if (logoBitmap == null) {
            return qrBitmap
        }

        // 创建新的Bitmap用于绘制带图标的二维码
        val resultBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(resultBitmap)
        val paint = Paint().apply { isAntiAlias = true }

        // 绘制二维码
        canvas.drawBitmap(qrBitmap, 0f, 0f, paint)

        // 计算图标大小和位置
        val logoSize = (width * logoSizeRatio).toInt()
        val logoX = (width - logoSize) / 2
        val logoY = (height - logoSize) / 2

        // 缩放图标
        val scaledLogo = Bitmap.createScaledBitmap(logoBitmap, logoSize, logoSize, true)

        // 绘制图标背景白色圆圈（可选）
        paint.color = Color.WHITE
        canvas.drawCircle(
            (logoX + logoSize / 2).toFloat(),
            (logoY + logoSize / 2).toFloat(),
            (logoSize / 2 + 10).toFloat(),
            paint
        )

        // 绘制图标
        canvas.drawBitmap(scaledLogo, logoX.toFloat(), logoY.toFloat(), paint)

        // 回收缩放后的图标以节省内存
        if (scaledLogo != logoBitmap) {
            scaledLogo.recycle()
        }

        return resultBitmap
    }
}
